home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Add-Ons
/
After Dark
/
Twist 1.0b1
/
ADTwist.c
< prev
next >
Wrap
Text File
|
1996-07-05
|
9KB
|
416 lines
/* ADTwist.c
* After Dark module that "twists" the screen pixels
* Copyright ©1996 Michael D. Crawford. All Rights Reserved.
* You may use this code on the condition that you read the following web page:
* http://www.scruznet.com/~crawford/WordServices/wdsvindex.html
*/
#include <QDOffscreen.h>
#include "GraphicsModule_Types.h"
#include "MessageHandlers.h"
#include "FindBrowser.h"
#define kCannotFindBrowserID 128
#define kMaxScreens 8
typedef struct{
short curLine;
GWorldPtr tempWorld;
GWorldPtr oldScreen;
}tScreenInfo, *tScreenInfoPtr, **tScreenInfoHdl;
typedef struct{
// short curLine;
Boolean firstDraw;
short curMonitor;
// GWorldPtr tempWorld;
// GWorldPtr oldScreen;
tScreenInfoHdl screenInfo[ kMaxScreens ];
} tTwistInfo, *tTwistPtr, **tTwistHandle;
void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr );
OSErr DoInitialize(Handle *storage, RgnHandle blankRgn, GMParamBlockPtr params)
{
tTwistHandle tHdl;
Rect r;
GWorldPtr tempWorld;
GWorldPtr oldScreen;
GWorldPtr curWorld;
GDHandle curDev;
OSErr err;
short i;
tHdl = (tTwistHandle)NewHandle( sizeof( tTwistInfo ) );
if ( !tHdl )
return MemError();
*storage = (Handle)tHdl;
(*tHdl)->firstDraw = true;
GetGWorld( &curWorld, &curDev );
for ( i = 0; i < params->monitors->monitorCount ; i++){
(*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NewHandle( sizeof( tScreenInfo ) );
if ( !(*tHdl)->screenInfo[ i ] )
return memFullErr;
r = params->monitors->monitorList[ i ].bounds;
err = NewGWorld( &oldScreen,
params->monitors->monitorList[ i ].curDepth,
&r,
(CTabHandle)NULL,
(GDHandle)NULL,
(GWorldFlags)0 );
if ( err )
return err;
(*(*tHdl)->screenInfo[ i ])->oldScreen = oldScreen;
LockPixels( oldScreen->portPixMap );
SetGWorld( oldScreen, curDev );
CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
(BitMap*)*( oldScreen )->portPixMap,
&r,
&r,
srcCopy,
(RgnHandle)NULL );
UnlockPixels( oldScreen->portPixMap );
r.right = r.left + 1;
(*(*tHdl)->screenInfo[ i ])->curLine = r.top;
err = NewGWorld( &tempWorld,
params->monitors->monitorList[ i ].curDepth,
&r,
(CTabHandle)NULL,
(GDHandle)NULL,
(GWorldFlags)0 );
if ( err )
return err;
(*(*tHdl)->screenInfo[ i ])->tempWorld = tempWorld;
LockPixels( tempWorld->portPixMap );
}
for ( ; i < kMaxScreens; i++ ){
(*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NULL;
}
SetGWorld( curWorld, curDev );
return noErr;
}
OSErr DoClose( Handle storage,RgnHandle blankRgn,GMParamBlockPtr params )
{
tTwistHandle tHdl;
short i;
tHdl = (tTwistHandle)storage;
if ( !tHdl )
return noErr;
for ( i = 0; i < kMaxScreens; i++ ){
if ( (*tHdl)->screenInfo[ i ] ){
if ( (*(*tHdl)->screenInfo[ i ])->tempWorld )
DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->tempWorld );
if ( (*(*tHdl)->screenInfo[ i ])->oldScreen )
DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
}
}
DisposeHandle( (Handle)tHdl );
return noErr;
}
OSErr DoBlank(Handle storage, RgnHandle blankRgn, GMParamBlockPtr params)
{
PicHandle pictH;
Rect r;
Rect screenRect;
Rect toRect;
GWorldPtr curWorld;
GWorldPtr picWorld;
GDHandle curDev;
OSErr err;
long newTime;
FillRgn( blankRgn, ¶ms->qdGlobalsCopy->qdBlack );
pictH = GetPicture( 1000 );
if ( !pictH )
return noErr;
r = (*pictH)->picFrame;
err = NewGWorld( &picWorld,
1,
&r,
(CTabHandle)NULL,
(GDHandle)NULL,
(GWorldFlags)0 );
if ( err )
return err;
LockPixels( picWorld->portPixMap );
GetGWorld( &curWorld, &curDev );
SetGWorld( picWorld, curDev );
DrawPicture( pictH, &r );
InvertRect( &r );
SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
screenRect = params->monitors->monitorList[ 0 ].bounds;
CenterRect( &toRect, &r, &screenRect );
CopyBits( (BitMap*)*( picWorld )->portPixMap,
¶ms->qdGlobalsCopy->qdThePort->portBits,
&r,
&toRect,
srcCopy,
(RgnHandle)NULL );
ReleaseResource( (Handle)pictH );
Delay( 60, &newTime );
return noErr;
}
void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr )
{
short inWidth;
short inHeight;
inWidth = inPtr->right - inPtr->left;
inHeight = inPtr->bottom - inPtr->top;
toPtr->left = inPtr->left + ( inWidth / 2 )
- ( fromPtr->right - fromPtr->left ) / 2;
toPtr->top = inPtr->top + ( inHeight / 2 )
- ( fromPtr->bottom - fromPtr->top ) / 2;
toPtr->right = toPtr->left + ( fromPtr->right - fromPtr->left );
toPtr->bottom = toPtr->top + ( fromPtr->bottom - fromPtr->top );
return;
}
OSErr DoDrawFrame(Handle storage,RgnHandle blankRgn,GMParamBlockPtr params)
{
tTwistHandle tHdl;
short curLine;
GWorldPtr tempWorld;
Rect fromRect;
Rect toRect;
Rect scrollRect;
GDHandle curDev;
GWorldPtr curWorld;
short i;
short j;
tHdl = (tTwistHandle)storage;
GetGWorld( &curWorld, &curDev );
if ( (*tHdl)->firstDraw ){
(*tHdl)->firstDraw = false;
for ( i = 0; i < kMaxScreens; i++ ){
if ( (*tHdl)->screenInfo[ i ] ){
fromRect = params->monitors->monitorList[ i ].bounds;
SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
LockPixels( ((*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap );
CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap,
¶ms->qdGlobalsCopy->qdThePort->portBits,
&fromRect,
&fromRect,
srcCopy,
(RgnHandle)NULL );
DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
(*(*tHdl)->screenInfo[ i ])->oldScreen = (GWorldPtr)NULL;
}
}
}
#define kNumLoops 15
for ( i = 0; i < kNumLoops; i++ ){
for ( j = 0; j < params->monitors->monitorCount; j++ ){
(*(*tHdl)->screenInfo[ j ])->curLine++;
if ( ( *(*tHdl)->screenInfo[ j ])->curLine
>= params->monitors->monitorList[ j ].bounds.bottom ){
(*(*tHdl)->screenInfo[ j ])->curLine
= params->monitors->monitorList[ j ].bounds.top;
}
curLine = (*(*tHdl)->screenInfo[ j ])->curLine;
fromRect = params->monitors->monitorList[ j ].bounds;
toRect = fromRect;
scrollRect = fromRect;
fromRect.left = fromRect.right - 1;
fromRect.bottom = curLine;
toRect.right = toRect.left + 1;
toRect.bottom = curLine;
scrollRect.bottom = curLine;
SetGWorld( (*(*tHdl)->screenInfo[ j ])->tempWorld, curDev );
CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
(BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
&fromRect,
&toRect,
srcCopy,
(RgnHandle)NULL );
SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
ScrollRect( &scrollRect, 1, 0, (RgnHandle)NULL );
CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
¶ms->qdGlobalsCopy->qdThePort->portBits,
&toRect,
&toRect,
srcCopy,
(RgnHandle)NULL );
}
}
return noErr;
}
OSErr DoSetUp(RgnHandle blankRgn,short message,GMParamBlockPtr params)
{
return noErr;
}
OSErr DoButton(RgnHandle blankRgn,short message,GMParamBlockPtr params)
{
AEAddressDesc creatorDesc;
AppleEvent gurlEvt;
AppleEvent replyEvt;
OSType creator;
AEDesc urlDesc;
StringHandle urlStr;
long len;
OSErr err;
err = FindBrowser( &creator );
if ( err ){
return err;
}
if ( creator == 'null' ){
StopAlert( kCannotFindBrowserID, (ModalFilterUPP)NULL );
return noErr;
}
err = AECreateDesc( typeApplSignature,
(Ptr)&creator,
sizeof( creator ),
&creatorDesc );
if ( err )
return err;
urlStr = (StringHandle)GetResource( 'STR ', 129 );
if ( !urlStr )
return resNotFound;
len = GetHandleSize( (Handle)urlStr );
err = AECreateDesc( typeChar,
&( (*urlStr)[ 1 ] ),
len - 1,
&urlDesc );
if ( err )
return err;
if ( creator == 'MOS!' ){
// NCSA Mosaic has its own ideas for AE urls
err = AECreateAppleEvent( 'mos!',
'ourl',
&creatorDesc,
kAutoGenerateReturnID,
kAnyTransactionID,
&gurlEvt );
}else{
err = AECreateAppleEvent( 'GURL',
'GURL',
&creatorDesc,
kAutoGenerateReturnID,
kAnyTransactionID,
&gurlEvt );
}
if ( err )
return err;
err = AEDisposeDesc( &creatorDesc );
if ( err )
return err;
err = AEPutParamDesc( &gurlEvt,
keyDirectObject,
&urlDesc );
if ( err )
return err;
err = AEDisposeDesc( &urlDesc );
if ( err )
return err;
err = AESend( &gurlEvt,
&replyEvt,
kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
kAENormalPriority,
300,
(AEIdleUPP)NULL,
(AEFilterUPP)NULL );
if ( err ){
return err;
}
err = AEDisposeDesc( &gurlEvt );
if ( err )
return noErr;
err = AEDisposeDesc( &replyEvt );
if ( err )
return noErr;
return noErr;
}